<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>12_6_2-3-为组件定制守卫函数-获取组件函数</title>
</head>

<body>


    <script src="https://unpkg.com/vue@3"></script>
    <script src="https://unpkg.com/vue-router@4"></script>


    <div id="app">
        <h1>你好呀，路由!</h1>
        <!--使用 router-link 组件进行导航 -->
        <!--通过传递 `to` 来指定链接 -->
        <!--`<router-link>` 将呈现一个带有正确 `href` 属性的 `<a>` 标签-->
        <router-link to="/">回到首页</router-link> <br />
        <router-link to="/user/小王">用户名页 - 小王</router-link> <br />
        <router-link to="/user/666">用户ID页 - 666</router-link> <br />
        <router-link to="/user/888">用户ID页 - 888</router-link> <br />
        <!-- 路由出口 -->
        <!-- 路由匹配到的组件将渲染在这里 -->
        <router-view></router-view>
    </div>
    <script>
        // 1. 定义路由组件.
        // 也可以从其他文件导入
        const Home = { template: '<div>欢迎来到首页</div>' }
        const User = { template: '<h1>这里是用户名页面</h1><h2>您的用户名是：{{ $route.params.name }}</h2>', }
        const UserSetting = {
            template: '<h1>这里是设置页面</h1><h2>您的ID是：{{ $route.params.id }}</h2>',
            beforeRouteEnter(to, from, next) {
                // 在渲染该组件的对应路由被验证前调用
                // 不能获取组件实例 `this` ！
                // 因为当守卫执行时，组件实例还没被创建！
                console.log(to, from, "前置守卫");
                next((w) => {
                    console.log(w);//w为当前组件实例
                })
                return true;
            },
            beforeRouteUpdate(to, from) {
                // 在当前路由改变，但是该组件被复用时调用
                // 举例来说，对于一个带有动态参数的路径 `/users/:id`，在 `/users/1` 和 `/users/2` 之间跳转的时候，
                // 由于会渲染同样的 `UserDetails` 组件，因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
                // 因为在这种情况发生的时候，组件已经挂载好了，导航守卫可以访问组件实例 `this`
                console.log(to, from, "路由参数有更新时的守卫");
            },
            beforeRouteLeave(to, from) {
                // 在导航离开渲染该组件的对应路由时调用
                // 与 `beforeRouteUpdate` 一样，它可以访问组件实例 `this`
                console.log(to, from, "离开页面");
            },
        }

        // 2. 定义一些路由
        // 每个路由都需要映射到一个组件。
        const routes = [
            { path: '/', component: Home },
            { path: '/user/:name', component: User, },
            { path: '/user/:id(\\d+)', component: UserSetting },
        ]
        // 3. 创建路由实例并传递 `routes` 配置
        // 你可以在这里输入更多的配置，但我们在这里
        // 暂时保持简单
        const router = VueRouter.createRouter({
            // 4. 内部提供了 history 模式的实现。为了简单起见，我们在这里使用 hash 模式。
            history: VueRouter.createWebHashHistory(),
            routes, // `routes: routes` 的缩写
        })

        // 5. 创建并挂载根实例
        const app = Vue.createApp({})
        //确保 _use_ 路由实例使
        //整个应用支持路由。
        app.use(router)

        app.mount('#app')

// 现在，应用已经启动了！
    </script>
</body>

</html>